﻿using MetroFramework.Forms;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Database.Model;
using Database.Control;
using System.Globalization;
using Database;



namespace ProjectZero
{
    public partial class CadastroCliente : MetroForm
    {
        //instancia banco de dados
        Entities context = new Entities();
        CAD_CLIENTE cliente;
        CAD_CLIENTE_ENDERECO ClienteEndereco;
        int pessoa;

        //true: tela nova para um novo registro
        //false: apenas carrega o registro
        bool novo = true;
        Int64 idCliente = 0;


        public CadastroCliente()
        {
            InitializeComponent();
        }

        public CadastroCliente(Int64 id, bool novoCliente)
        {
            try
            {
                InitializeComponent();
                novo = novoCliente;
                idCliente = id;

                tela();
            }
            catch (Exception exe)
            {
                MessageBox.Show("Erro ao resgatar registro!\nDescrição do erro:\n " + exe, "Mensagem", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }

        private void tela()
        {
            try
            {
                //popula os combobox referente ao endereço
                carregaPropriedadesEndereco();

                if (novo)
                {
                    btnExcluir.Enabled = false;
                    lblCod.Text = "Novo";
                }
                else
                {
                    Entities context = new Entities();
                    cliente = context.CAD_CLIENTE.Find(idCliente);
                    ClienteEndereco = CAD_CLIENTE_ENDERECO.FindEnd(idCliente);

                    txtNome.Text = cliente.NOME;
                    txtRazao.Text = cliente.RAZAO;
                    txtEmail.Text = cliente.EMAIL;
                    txtTelefone.Text = cliente.TELEFONE;
                    txtSite.Text = cliente.SITE;
                    txtCpfCnpj.Text = Class.Format.MascaraCnpjCpf(cliente.CPF_CNPJ);
                    txtRg.Text = Class.Format.MascaraRg(cliente.RG);
                    txtBairro.Text = ClienteEndereco.BAIRRO;
                    txtComplemento.Text = ClienteEndereco.COMPLEMENTO;
                    txtEndereco.Text = ClienteEndereco.ENDERECO;
                    txtNum.Text = ClienteEndereco.NUMERO;
                    txtObs.Text = cliente.OBS;
                    cbxPais.SelectedValue = ClienteEndereco.PAIS_ID;
                    cbxEstado.SelectedValue = ClienteEndereco.ESTADO_ID;
                    carregaCidade();
                    cbxCidade.SelectedValue = ClienteEndereco.CIDADE_ID;
                    txtCriacao.Text = cliente.DT_CADASTRO.ToString();

                    if (cliente.ATIVO.Equals("S"))
                        rdbAtivo.Checked = true;
                    else
                        rdbInativo.Checked = true;
                    
                    //seta o tipo de pesoa
                    if (cliente.TIPO_ID==1)
                       rdbPesFis.Checked = true;
                    else
                        rdbPesJur.Checked = true;

                    lblCod.Text = cliente.CLIENTE_ID.ToString();
                    btnExcluir.Enabled = true;
                    context.Dispose();
                }
                verificaPessoa();
                validaCidade();
            }
            catch (Exception exe)
            {
                MessageBox.Show("Erro ao resgatar registro!\nDescrição do erro:\n " + exe, "Mensagem", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }

        private void Salvar()
        {
            try
            {
                //valida campos
                if (!validacao())
                    return;

                if (novo)//se é um novo cliente que esta sendo inserido
                {
                    CAD_CLIENTE NovoCliente = new CAD_CLIENTE();

                    #region principal
                    NovoCliente.NOME = txtNome.Text;
                    NovoCliente.EMAIL = txtEmail.Text;
                    NovoCliente.TELEFONE = txtTelefone.Text;
                    NovoCliente.RG = Class.Format.OnlyNumbers(txtRg.Text);
                    NovoCliente.SITE = txtSite.Text;
                    NovoCliente.DT_CADASTRO = System.DateTime.Now;
                    NovoCliente.CPF_CNPJ = Class.Format.OnlyNumbers(txtCpfCnpj.Text);
                    NovoCliente.OBS = txtObs.Text;

                    if (rdbAtivo.Checked)
                        NovoCliente.ATIVO = "S";
                    else
                        NovoCliente.ATIVO = "N";

                    if (rdbPesFis.Checked)
                    {
                        NovoCliente.RG = txtRg.Text;
                        NovoCliente.TIPO_ID = 1;
                    }
                    else
                    {
                        NovoCliente.RAZAO = txtRazao.Text;
                        NovoCliente.TIPO_ID = 2;
                    }

                    #endregion

                    #region endereco
                    CAD_CLIENTE_ENDERECO ClienteEndereco = new CAD_CLIENTE_ENDERECO();

                    ClienteEndereco.ENDERECO = txtEndereco.Text;
                    ClienteEndereco.NUMERO = txtNum.Text;
                    ClienteEndereco.CEP = txtCep.Text;
                    ClienteEndereco.BAIRRO = txtBairro.Text;
                    ClienteEndereco.COMPLEMENTO = txtComplemento.Text;

                    ClienteEndereco.PAIS_ID = Convert.ToInt16(cbxPais.SelectedValue);
                    ClienteEndereco.ESTADO_ID = Convert.ToInt16(cbxEstado.SelectedValue);
                    ClienteEndereco.CIDADE_ID = Convert.ToInt16(cbxCidade.SelectedValue);

                    #endregion

                    NovoCliente.Create();
                    ClienteEndereco.CLIENTE_ID = NovoCliente.CLIENTE_ID;
                    context.CAD_CLIENTE_ENDERECO.Add(ClienteEndereco);
                    context.SaveChanges();
                    context.Dispose();

                    //Atualiza página
                    idCliente = NovoCliente.CLIENTE_ID;
                    novo = false;
                    tela();
                }
                else
                {
                    #region principal
                    cliente.NOME = txtNome.Text;
                    cliente.EMAIL = txtEmail.Text;
                    cliente.TELEFONE = txtTelefone.Text;
                    cliente.RG = Class.Format.OnlyNumbers(txtRg.Text);
                    cliente.SITE = txtSite.Text;
                    cliente.DT_CADASTRO = System.DateTime.Now;
                    cliente.CPF_CNPJ = Class.Format.OnlyNumbers(txtCpfCnpj.Text);
                    cliente.OBS = txtObs.Text;

                    if (rdbAtivo.Checked)
                        cliente.ATIVO = "S";
                    else
                        cliente.ATIVO = "N";

                    if (rdbPesFis.Checked)
                    {
                        cliente.RG = txtRg.Text;
                        cliente.TIPO_ID = 1;
                    }
                    else
                    {
                        cliente.RAZAO = txtRazao.Text;
                        cliente.TIPO_ID = 2;
                    }
                    cliente.Save();
                    #endregion

                    #region endereço 
                    context = new Entities();
                    CAD_CLIENTE_ENDERECO ClienteEndereco = context.CAD_CLIENTE_ENDERECO.First(p => p.CLIENTE_ID == idCliente);
                    ClienteEndereco.ENDERECO = txtEndereco.Text;
                    ClienteEndereco.NUMERO = txtNum.Text;
                    ClienteEndereco.CEP = txtCep.Text;
                    ClienteEndereco.BAIRRO = txtBairro.Text;
                    ClienteEndereco.COMPLEMENTO = txtComplemento.Text;

                    ClienteEndereco.PAIS_ID = Convert.ToInt16(cbxPais.SelectedValue);
                    ClienteEndereco.ESTADO_ID = Convert.ToInt16(cbxEstado.SelectedValue);
                    ClienteEndereco.CIDADE_ID = Convert.ToInt16(cbxCidade.SelectedValue);
                    context.SaveChanges();
                    #endregion
                }

                MessageBox.Show("Registro salvo com Sucesso!", "Mensagem", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Erro ao salvar registro!\nDescrição do erro:\n " + ex, "Mensagem", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }

        private void btnSalvar_Click(object sender, EventArgs e)
        {
            Salvar();
        }

        private void verificaPessoa()
        {
            try
            {
                if (rdbPesFis.Checked == true)
                {
                    txtRg.Enabled = true;
                    txtRazao.Enabled = false;
                    txtRazao.Text = string.Empty;
                    pessoa = 1;
                    lbCpfCnpj.Text = "CPF:";
                }
                else
                {
                    txtRg.Enabled = false;
                    txtRazao.Enabled = true;
                    txtRg.Text = string.Empty;
                    pessoa = 2;
                    lbCpfCnpj.Text = "CNPJ:";
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Não foi possível verificar o tipo do cliente!\nDescrição do erro:\n " + ex, "Mensagem", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }

        private void rdbPesFis_CheckedChanged(object sender, EventArgs e)
        {
            verificaPessoa();
        }

        private void rdbPesJur_CheckedChanged(object sender, EventArgs e)
        {
            verificaPessoa();
        }

        private bool validacao()
        {
            try
            {
                #region vars
                bool verifica = true;
                Label lb = null;
                TextBox txt = null;
                string tamText = string.Empty;
                bool verificaTam = false;
                #endregion

                #region resetacomponentes
                //Reseta os labels validados anteriormente
                lblPanel.Visible = false;
                foreach (Control x in metroTabControl1.Controls)
                {
                    TabPage tab = (TabPage)x;
                    foreach (Control c in tab.Controls)
                    {
                        if (c is Label)
                        {
                            c.ForeColor = System.Drawing.Color.Black;
                            c.Text = c.Text.ToString().Replace("*", "");
                        }
                    }
                }
                #endregion

                #region validaNome
                if (string.IsNullOrEmpty(txtNome.Text) || txtNome.Text.Length > 50)
                {
                    lb = lbFantasia;
                    txt = txtNome;
                    verifica = false;
                    if (txt.Text.Length > 50)
                    {
                        tamText = "50";
                        verificaTam = true;
                    }
                }
                #endregion

                #region ValidaRazao
                if (txtRazao.Text.Length > 50)
                {
                    lb = lbNomeRazao;
                    txt = txtRazao;
                    tamText = "50";
                    verificaTam = true;
                }
                #endregion

                #region validaSite
                if (lblSite.Text.Length > 50)
                {
                    lb = lblSite;
                    txt = txtSite;
                    tamText = "50";
                    verificaTam = true;
                }
                #endregion

                #region validaCpfCnpj
                if (!string.IsNullOrEmpty(txtCpfCnpj.Text))
                {
                    if (pessoa == 1)
                    {
                        if (!Class.Validar.ValidaCPF(txtCpfCnpj.Text))
                        {
                            lb = lbCpfCnpj;
                            txt = txtCpfCnpj;
                            verifica = false;
                        }
                    }
                    else if (!Class.Validar.IsCnpj(txtCpfCnpj.Text))
                    {
                        lb = lbCpfCnpj;
                        txt = txtCpfCnpj;
                        verifica = false;
                    }
                }
                #endregion

                #region validaEmail
                if (!Class.Validar.ValidaEmail(txtEmail.Text) || txtEmail.Text.Length > 50)
                {
                    lb = lblEmail;
                    txt = txtEmail;
                    verifica = false;
                    if (txt.Text.Length > 50)
                    {
                        tamText = "50";
                        verificaTam = true;
                    }
                }
                #endregion

                #region validaOsb
                if (txtObs.Text.Length > 300)
                {
                    lb = lblObs;
                    txt = txtObs;
                    verifica = false;
                    tamText = "300";
                    verificaTam = true;
                }

                #endregion

                #region Alerta
                //alerta o usuario
                if (!verifica || verificaTam)
                {
                    lblPanel.Visible = true;
                    lb.ForeColor = System.Drawing.Color.Red;
                    txt.Focus();
                    metroTabControl1.SelectedTab = metroTabPage1;
                    if (verificaTam)
                    {
                        lblPanel.Text = "Campo '" + lb.Text.Replace(":", "") + "' deve possuir no máximo " + tamText + " caracteres";
                    }
                    else
                    {
                        lblPanel.Text = "Campo '" + lb.Text.Replace(":", "") + "' obrigatório ou Inválido";
                    }
                    lb.Text += "*";
                    return false;
                }
                #endregion

                return true;
            }
            catch (Exception exe)
            {
                MessageBox.Show("Erro ao realizar as validações do cliente!\nDescrição do erro:\n " + exe, "Mensagem", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return false;
            }
        }

        private void carregaPropriedadesEndereco()
        {
            try
            {
                cbxPais.DataSource = Database.Control.Endereco.Pais.BuscaPais();
                cbxPais.DisplayMember = "NOME";
                cbxPais.ValueMember = "PAIS_ID";

                cbxEstado.DataSource = Database.Control.Endereco.Estado.BuscaEstado(Convert.ToInt32(cbxPais.SelectedValue.ToString()));
                cbxEstado.DisplayMember = "SIGLA";
                cbxEstado.ValueMember = "ESTADO_ID";

                cbxCidade.DataSource = Database.Control.Endereco.Cidade.BuscaCidades(Convert.ToInt32(cbxEstado.SelectedValue.ToString()));
                cbxCidade.DisplayMember = "MUNICIPIO";
                cbxCidade.ValueMember = "CIDADE_ID";
            }
            catch (Exception ex)
            {
                MessageBox.Show("Erro ao Carregar informações relacionadas ao endereço do cliente!\nDescrição do erro:\n " + ex, "Mensagem", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }

        private void cbxEstado_SelectionChangeCommitted(object sender, EventArgs e)
        {
            carregaCidade();
        }

        private void carregaCidade()
        {
            try
            {
                cbxCidade.DataSource = Database.Control.Endereco.Cidade.BuscaCidades(Convert.ToInt32(cbxEstado.SelectedValue.ToString()));
                cbxCidade.DisplayMember = "MUNICIPIO";
                cbxCidade.ValueMember = "CIDADE_ID";

                validaCidade();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Erro ao Caregar Cidade!\nDescrição do erro:\n " + ex, "Mensagem", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }

        private void validaCidade()
        {
            if (cbxEstado.Text == string.Empty)
                cbxCidade.Enabled = false;
            else
                cbxCidade.Enabled = true;
        }

        private void btnExcluir_Click(object sender, EventArgs e)
        {
            excluiCliente();
        }

        private void excluiCliente()
        {
            try
            {
                Entities context = new Entities();
                cliente = context.CAD_CLIENTE.First(p=>p.CLIENTE_ID==idCliente);
                CAD_CLIENTE_ENDERECO ClienteEndereco = context.CAD_CLIENTE_ENDERECO.First(p => p.CLIENTE_ID == idCliente);
                context.CAD_CLIENTE_ENDERECO.Attach(ClienteEndereco);
                context.CAD_CLIENTE_ENDERECO.Remove(ClienteEndereco);
                context.SaveChanges();
                
                context.CAD_CLIENTE.Attach(cliente);
                context.CAD_CLIENTE.Remove(cliente);
                context.SaveChanges();
                this.Close();

                MessageBox.Show("Registro excluido com sucesso ", "Mensagem", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Erro ao deletar registro!\nDescrição do erro:\n " + ex, "Mensagem", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }

        private void CadastroCliente_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Escape)
                this.Close();
            else if (e.KeyCode == Keys.F2)
                Salvar();
            else if (e.KeyCode == Keys.F3)
                excluiCliente();
        }

        private void pcbAtualizar_Click(object sender, EventArgs e)
        {
            tela();
        }

        private void pictureBox1_Click(object sender, EventArgs e)
        {
            try
            {
                Entities contexr = new Entities();

                ReportViewer c = new ReportViewer();

                c.cADCLIENTEBindingSource.DataSource = CAD_CLIENTE.Find(idCliente);
                c.cADCLIENTEENDERECOBindingSource.DataSource = CAD_CLIENTE_ENDERECO.FindEnd(idCliente);
                c.Show();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Não foi possível realizar a impressão do relatório!\nDescrição do erro:\n " + ex, "Mensagem", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }

        private void pictureBox2_Click(object sender, EventArgs e)
        {
            try
            {
                string target = "http://" + txtSite.Text;
                System.Diagnostics.Process.Start(target);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Não foi possível abrir site informado!\nDescrição do erro:\n " + ex, "Mensagem", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }

    }
}
